#include <string>
#include <memory>
#include <iostream>

//g++ main.cpp -std=c++0x

using namespace std;


class Punto {
  string nombre;
  int x, y, z;
  shared_ptr<Punto> padre ;
public:
Punto (string, int, int, int);
~Punto();
void setCoordenadas (int,int,int);
int  getX ();
int  getY ();
int  getZ ();
void  setX (int);
void  setY (int);
void  setZ (int);
void setPadre (shared_ptr<Punto> &);
shared_ptr<Punto> getPadre ();
};

Punto::Punto(string n,int ax, int ay, int az){
  nombre = n;
  cout << "Constructing " << ( void* )this << " " << nombre << endl;
  x=ax;
  y=ay;
  z=az;
}

Punto::~Punto  ( )
   {
      cout << "Destructing " << ( void* )this << " " << nombre << endl;

   };

void Punto::setCoordenadas(int ax, int ay, int az){
  x=ax;
  y=ay;
  z=az;
}

int Punto::getX(){
  return x;
}
int Punto::getY(){
  return y;
}
int Punto::getZ(){
  return z;
}

void Punto::setX(int a){
  x=a;
}
void Punto::setY(int a){
  y=a;
}
void Punto::setZ(int a){
  z=a;
}


void Punto::setPadre(shared_ptr<Punto> &p){
  padre = p;
}

shared_ptr<Punto> Punto::getPadre(){
  return padre;
}


void incrementa_punto(shared_ptr<Punto> &p) {
  p->setX(p->getX()+1);
  p->setY(p->getY()+1);
  p->setZ(p->getZ()+1);
}

int main(){
  char c;

  shared_ptr<Punto> p1 (new Punto("P1", 1,1,1));
  cout << "p1: " << p1->getX() << " " << p1->getY() << " " << p1->getZ() << endl;
  incrementa_punto (p1);
  cout << "p1: " << p1->getX() << " " << p1->getY() << " " << p1->getZ() << endl;
  shared_ptr<Punto> p3 (new Punto("P3", 3,3,3));
  shared_ptr<Punto> p4 (new Punto("P4", 3,3,3));
  p3->setPadre(p1);

  p1.reset();
  cin>>c;
  p3->setPadre(p4);
  p4.reset();
  cin>>c;
  p3.reset();
  cin>>c;
}

